home *** CD-ROM | disk | FTP | other *** search
- package java.util;
-
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.Serializable;
- import java.io.StreamCorruptedException;
-
- public class IdentityHashMap<K, V> extends AbstractMap<K, V> implements Map<K, V>, Serializable, Cloneable {
- private static final int DEFAULT_CAPACITY = 32;
- private static final int MINIMUM_CAPACITY = 4;
- private static final int MAXIMUM_CAPACITY = 536870912;
- private transient Object[] table;
- private int size;
- private transient volatile int modCount;
- private transient int threshold;
- private static final Object NULL_KEY = new Object();
- private transient Set<Map.Entry<K, V>> entrySet;
- private static final long serialVersionUID = 8188218128353913216L;
-
- private static Object maskNull(Object var0) {
- return var0 == null ? NULL_KEY : var0;
- }
-
- private static Object unmaskNull(Object var0) {
- return var0 == NULL_KEY ? null : var0;
- }
-
- public IdentityHashMap() {
- this.entrySet = null;
- this.init(32);
- }
-
- public IdentityHashMap(int var1) {
- this.entrySet = null;
- if (var1 < 0) {
- throw new IllegalArgumentException("expectedMaxSize is negative: " + var1);
- } else {
- this.init(this.capacity(var1));
- }
- }
-
- private int capacity(int var1) {
- int var2 = 3 * var1 / 2;
- int var3;
- if (var2 <= 536870912 && var2 >= 0) {
- for(var3 = 4; var3 < var2; var3 <<= 1) {
- }
- } else {
- var3 = 536870912;
- }
-
- return var3;
- }
-
- private void init(int var1) {
- this.threshold = var1 * 2 / 3;
- this.table = new Object[2 * var1];
- }
-
- public IdentityHashMap(Map<? extends K, ? extends V> var1) {
- this((int)((double)(1 + var1.size()) * 1.1));
- this.putAll(var1);
- }
-
- public int size() {
- return this.size;
- }
-
- public boolean isEmpty() {
- return this.size == 0;
- }
-
- private static int hash(Object var0, int var1) {
- int var2 = System.identityHashCode(var0);
- return (var2 << 1) - (var2 << 8) & var1 - 1;
- }
-
- private static int nextKeyIndex(int var0, int var1) {
- return var0 + 2 < var1 ? var0 + 2 : 0;
- }
-
- public V get(Object var1) {
- Object var2 = maskNull(var1);
- Object[] var3 = this.table;
- int var4 = var3.length;
- int var5 = hash(var2, var4);
-
- while(true) {
- Object var6 = var3[var5];
- if (var6 == var2) {
- return (V)var3[var5 + 1];
- }
-
- if (var6 == null) {
- return null;
- }
-
- var5 = nextKeyIndex(var5, var4);
- }
- }
-
- public boolean containsKey(Object var1) {
- Object var2 = maskNull(var1);
- Object[] var3 = this.table;
- int var4 = var3.length;
- int var5 = hash(var2, var4);
-
- while(true) {
- Object var6 = var3[var5];
- if (var6 == var2) {
- return true;
- }
-
- if (var6 == null) {
- return false;
- }
-
- var5 = nextKeyIndex(var5, var4);
- }
- }
-
- public boolean containsValue(Object var1) {
- Object[] var2 = this.table;
-
- for(int var3 = 1; var3 < var2.length; var3 += 2) {
- if (var2[var3] == var1) {
- return true;
- }
- }
-
- return false;
- }
-
- private boolean containsMapping(Object var1, Object var2) {
- Object var3 = maskNull(var1);
- Object[] var4 = this.table;
- int var5 = var4.length;
- int var6 = hash(var3, var5);
-
- while(true) {
- Object var7 = var4[var6];
- if (var7 == var3) {
- return var4[var6 + 1] == var2;
- }
-
- if (var7 == null) {
- return false;
- }
-
- var6 = nextKeyIndex(var6, var5);
- }
- }
-
- public V put(K var1, V var2) {
- Object var3 = maskNull(var1);
- Object[] var4 = this.table;
- int var5 = var4.length;
-
- int var6;
- Object var7;
- for(var6 = hash(var3, var5); (var7 = var4[var6]) != null; var6 = nextKeyIndex(var6, var5)) {
- if (var7 == var3) {
- Object var8 = var4[var6 + 1];
- var4[var6 + 1] = var2;
- return (V)var8;
- }
- }
-
- ++this.modCount;
- var4[var6] = var3;
- var4[var6 + 1] = var2;
- if (++this.size >= this.threshold) {
- this.resize(var5);
- }
-
- return null;
- }
-
- private void resize(int var1) {
- int var2 = var1 * 2;
- Object[] var3 = this.table;
- int var4 = var3.length;
- if (var4 == 1073741824) {
- if (this.threshold == 536870911) {
- throw new IllegalStateException("Capacity exhausted.");
- } else {
- this.threshold = 536870911;
- }
- } else if (var4 < var2) {
- Object[] var5 = new Object[var2];
- this.threshold = var2 / 3;
-
- for(int var6 = 0; var6 < var4; var6 += 2) {
- Object var7 = var3[var6];
- if (var7 != null) {
- Object var8 = var3[var6 + 1];
- var3[var6] = null;
- var3[var6 + 1] = null;
-
- int var9;
- for(var9 = hash(var7, var2); var5[var9] != null; var9 = nextKeyIndex(var9, var2)) {
- }
-
- var5[var9] = var7;
- var5[var9 + 1] = var8;
- }
- }
-
- this.table = var5;
- }
- }
-
- public void putAll(Map<? extends K, ? extends V> var1) {
- int var2 = var1.size();
- if (var2 != 0) {
- if (var2 > this.threshold) {
- this.resize(this.capacity(var2));
- }
-
- for(Map.Entry var4 : var1.entrySet()) {
- this.put(var4.getKey(), var4.getValue());
- }
-
- }
- }
-
- public V remove(Object var1) {
- Object var2 = maskNull(var1);
- Object[] var3 = this.table;
- int var4 = var3.length;
- int var5 = hash(var2, var4);
-
- while(true) {
- Object var6 = var3[var5];
- if (var6 == var2) {
- ++this.modCount;
- --this.size;
- Object var7 = var3[var5 + 1];
- var3[var5 + 1] = null;
- var3[var5] = null;
- this.closeDeletion(var5);
- return (V)var7;
- }
-
- if (var6 == null) {
- return null;
- }
-
- var5 = nextKeyIndex(var5, var4);
- }
- }
-
- private boolean removeMapping(Object var1, Object var2) {
- Object var3 = maskNull(var1);
- Object[] var4 = this.table;
- int var5 = var4.length;
- int var6 = hash(var3, var5);
-
- while(true) {
- Object var7 = var4[var6];
- if (var7 == var3) {
- if (var4[var6 + 1] != var2) {
- return false;
- } else {
- ++this.modCount;
- --this.size;
- var4[var6] = null;
- var4[var6 + 1] = null;
- this.closeDeletion(var6);
- return true;
- }
- }
-
- if (var7 == null) {
- return false;
- }
-
- var6 = nextKeyIndex(var6, var5);
- }
- }
-
- private void closeDeletion(int var1) {
- Object[] var2 = this.table;
- int var3 = var2.length;
-
- Object var4;
- for(int var5 = nextKeyIndex(var1, var3); (var4 = var2[var5]) != null; var5 = nextKeyIndex(var5, var3)) {
- int var6 = hash(var4, var3);
- if (var5 < var6 && (var6 <= var1 || var1 <= var5) || var6 <= var1 && var1 <= var5) {
- var2[var1] = var4;
- var2[var1 + 1] = var2[var5 + 1];
- var2[var5] = null;
- var2[var5 + 1] = null;
- var1 = var5;
- }
- }
-
- }
-
- public void clear() {
- ++this.modCount;
- Object[] var1 = this.table;
-
- for(int var2 = 0; var2 < var1.length; ++var2) {
- var1[var2] = null;
- }
-
- this.size = 0;
- }
-
- public boolean equals(Object var1) {
- if (var1 == this) {
- return true;
- } else if (var1 instanceof IdentityHashMap) {
- IdentityHashMap var6 = (IdentityHashMap)var1;
- if (var6.size() != this.size) {
- return false;
- } else {
- Object[] var3 = var6.table;
-
- for(int var4 = 0; var4 < var3.length; var4 += 2) {
- Object var5 = var3[var4];
- if (var5 != null && !this.containsMapping(var5, var3[var4 + 1])) {
- return false;
- }
- }
-
- return true;
- }
- } else if (var1 instanceof Map) {
- Map var2 = (Map)var1;
- return this.entrySet().equals(var2.entrySet());
- } else {
- return false;
- }
- }
-
- public int hashCode() {
- int var1 = 0;
- Object[] var2 = this.table;
-
- for(int var3 = 0; var3 < var2.length; var3 += 2) {
- Object var4 = var2[var3];
- if (var4 != null) {
- Object var5 = unmaskNull(var4);
- var1 += System.identityHashCode(var5) ^ System.identityHashCode(var2[var3 + 1]);
- }
- }
-
- return var1;
- }
-
- public Object clone() {
- try {
- IdentityHashMap var1 = (IdentityHashMap)super.clone();
- var1.entrySet = null;
- var1.table = this.table.clone();
- return var1;
- } catch (CloneNotSupportedException var2) {
- throw new InternalError();
- }
- }
-
- public Set<K> keySet() {
- Set var1 = this.keySet;
- return var1 != null ? var1 : (this.keySet = new KeySet(this, (1)null));
- }
-
- public Collection<V> values() {
- Collection var1 = this.values;
- return var1 != null ? var1 : (this.values = new Values(this, (1)null));
- }
-
- public Set<Map.Entry<K, V>> entrySet() {
- Set var1 = this.entrySet;
- return var1 != null ? var1 : (this.entrySet = new EntrySet(this, (1)null));
- }
-
- private void writeObject(ObjectOutputStream var1) throws IOException {
- var1.defaultWriteObject();
- var1.writeInt(this.size);
- Object[] var2 = this.table;
-
- for(int var3 = 0; var3 < var2.length; var3 += 2) {
- Object var4 = var2[var3];
- if (var4 != null) {
- var1.writeObject(unmaskNull(var4));
- var1.writeObject(var2[var3 + 1]);
- }
- }
-
- }
-
- private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
- var1.defaultReadObject();
- int var2 = var1.readInt();
- this.init(this.capacity(var2 * 4 / 3));
-
- for(int var3 = 0; var3 < var2; ++var3) {
- Object var4 = var1.readObject();
- Object var5 = var1.readObject();
- this.putForCreate(var4, var5);
- }
-
- }
-
- private void putForCreate(K var1, V var2) throws IOException {
- Object var3 = maskNull(var1);
- Object[] var4 = this.table;
- int var5 = var4.length;
-
- int var6;
- Object var7;
- for(var6 = hash(var3, var5); (var7 = var4[var6]) != null; var6 = nextKeyIndex(var6, var5)) {
- if (var7 == var3) {
- throw new StreamCorruptedException();
- }
- }
-
- var4[var6] = var3;
- var4[var6 + 1] = var2;
- }
-
- // $FF: synthetic method
- static int access$000(IdentityHashMap var0) {
- return var0.size;
- }
-
- // $FF: synthetic method
- static Object[] access$100(IdentityHashMap var0) {
- return var0.table;
- }
-
- // $FF: synthetic method
- static int access$200(IdentityHashMap var0) {
- return var0.modCount;
- }
-
- // $FF: synthetic method
- static int access$204(IdentityHashMap var0) {
- return ++var0.modCount;
- }
-
- // $FF: synthetic method
- static int access$010(IdentityHashMap var0) {
- return var0.size--;
- }
-
- // $FF: synthetic method
- static int access$300(int var0, int var1) {
- return nextKeyIndex(var0, var1);
- }
-
- // $FF: synthetic method
- static int access$400(Object var0, int var1) {
- return hash(var0, var1);
- }
-
- // $FF: synthetic method
- static Object access$600(Object var0) {
- return unmaskNull(var0);
- }
-
- // $FF: synthetic method
- static boolean access$1300(IdentityHashMap var0, Object var1, Object var2) {
- return var0.containsMapping(var1, var2);
- }
-
- // $FF: synthetic method
- static boolean access$1400(IdentityHashMap var0, Object var1, Object var2) {
- return var0.removeMapping(var1, var2);
- }
- }
-